package com.itheima.reggie.web.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.web.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.entity.dto.LoginDto;
import com.itheima.reggie.entity.dto.PageDto;
import com.itheima.reggie.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 员工表现层类
 */
@Slf4j
@RestController  // = @Controller + @ResponseBody
@RequestMapping("/employee") // 员工所有请求前缀为/employee
public class EmployeeController {

    // 注入service
    @Autowired
    EmployeeService employeeService;

    // 注入session
    @Autowired
    HttpSession session;


    @GetMapping("/all")
    // 查询所有
    public R<List<Employee>> findAll() {
        List<Employee> employees = employeeService.list();

        return R.success("查询成功", employees);
    }


    /**
     * 登录
     *
     * @param loginDto 等录参数
     * @return 是否成功
     */
    @PostMapping("/login")
    public R<Employee> login(@RequestBody LoginDto loginDto) {
        log.info("开始登录，登录的用户名：{}，密码：{}", loginDto.getUsername(), loginDto.getPassword());


        // 调用service层方法完成登录
        R<Employee> result = employeeService.login(loginDto);


        // 如果登录成功，存入session
        if (result.getCode() == 1) {
            session.setAttribute("employee", result.getData().getId());
        }

        // 响应到页面
        return result;
    }


    /**
     * 退出登录
     *
     * @return 登出的结果
     */
    @PostMapping("/logout")
    public R logout() {

        // 清除session中的登录成功标识，也就是员工id
        session.removeAttribute("employee");


        // 响应结果
        return R.success("登出成功！");
    }


    /**
     * 新增用户，并检查用户名是否重复
     *
     * @param employee 要保存的用户信息
     * @return 是否保存成功
     */
    @PostMapping
    public R save(@RequestBody Employee employee) {
        log.info("新增用户，信息如下：{}", employee);

        // // 调用service处理后并保存
        // return employeeService.initAndSave(employee);

        // 调用service处理后并保存
        return employeeService.saveWithNameCheck(employee);
    }


    /**
     * 分页条件查询
     *
     * @param pageDto 分页参数和查询参数封装的实体类
     * @return 查询结果
     */
    @GetMapping("/page")
    public R<Page<Employee>> page(PageDto pageDto) {

        // 记录日志
        log.info("员工分页查询，分页条件：页码[{}]，页面大小[{}]，查询条件[{}]"
                , pageDto.getPage(), pageDto.getPageSize(), pageDto.getName());

        // 调用service查询并返回结果
        R<Page<Employee>> page = employeeService.page(pageDto);
        return page;
    }


    /**
     * 根据id修改属性，包含 只修改status状态。
     * <p>
     * 按需修改：除id之外，有值的属性会更新为对应的新值，没有值的属性不会被修改。
     *
     * @param employee 修改的信息
     * @return 修改的结果
     */
    @PutMapping
    public R updateById(@RequestBody Employee employee) {
        // 记录日志
        log.info("根据id修改员工，要修改为：[{}]", employee);
        // 记录线程名称，用于验证同一个请求是否是一个线程
        // log.error("线程信息：{}",Thread.currentThread().getName());

        // 1. 获取操作账户id
        // Long employeeId = (Long) session.getAttribute("employee");

        // 2. 封装更新时间和更新操作员，并保存到数据库
        // employee.setUpdateTime(LocalDateTime.now());
        // employee.setUpdateUser(employeeId);
        if (employeeService.updateById(employee)) {
            // 3. 组装结果并返回
            return R.success("修改成功！");
        }
        return R.fail("修改状态失败！");

    }


    /**
     * 根据id查询员工信息。
     *
     * @param id 查询的条件
     * @return id对应的员工对象
     */
    @GetMapping("/{id}")
    public R<Employee> findById(@PathVariable Long id) {
        // 记录日志
        log.info("根据id查询员工，id为:[{}]", id);

        // 参数校验

        // 调用service查询
        Employee employee = employeeService.getById(id);

        // 组织数据并返回
        if (employee != null) {
            // TODO 脱敏处理  这里设置为null，而非“” 避免再次提交保存的时候清空密码
            employee.setPassword(null);
            return R.success("查询成功", employee);
        }
        return R.fail("查询失败");
    }
}
